import axios from 'axios'
import axiosRetry from 'axios-retry'
import { showToast } from 'vant'

// 创建 axios 实例
const service = axios.create({
    baseURL: import.meta.env.DEV ? '/api' : 'https://x-driver.chaihongjun.me/api',
    timeout: 5000, // 请求超时时间
    //retries: 3, // 请求重试次数
})

// 配置重试
axiosRetry(service, {
    retries: 3, //重试3次
    retryDelay: (retryCount) => (retryCount + 1) * 2000, // 延迟 2s/4s/6s
    shouldResetTimeout: true, //axios每次请求可以用的时间 都是timeout
    retryCondition: (error) => {
        // 1. 超时或网络断开
        if (error.code === 'ECONNABORTED' || !error.response) return true;
        // 2. 仅重试服务器错误 (5xx)
        return error.response.status >= 500;
    }
});

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么，例如添加token
        // const token = localStorage.getItem('token');
        // if (token) {
        //   config.headers.Authorization = `Bearer ${token}`;
        // }
        return config
    },
    (error) => {
        // 对请求错误做些什么
        console.error('Request Error:', error)
        return Promise.reject(error)
    },
)

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        // 对响应数据做点什么
        return response.data
    },
    (error) => {
        // 对响应错误做点什么
        let errorMessage = '请求失败，请稍后再试'
        if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
            errorMessage = '请求超时，请检查网络连接或稍后再试'
        } else if (error.response) {
            switch (error.response.status) {
                case 400:
                    errorMessage = '请求错误(400)'
                    break
                case 401:
                    errorMessage = '未授权，请重新登录(401)'
                    break
                case 403:
                    errorMessage = '拒绝访问(403)'
                    break
                case 404:
                    errorMessage = '请求出错(404)'
                    break
                case 408:
                    errorMessage = '请求超时(408)'
                    break
                case 500:
                    errorMessage = '服务器错误(500)'
                    break
                case 501:
                    errorMessage = '服务未实现(501)'
                    break
                case 502:
                    errorMessage = '网络错误(502)'
                    break
                case 503:
                    errorMessage = '服务不可用(503)'
                    break
                case 504:
                    errorMessage = '网络超时(504)'
                    break
                case 505:
                    errorMessage = 'HTTP版本不受支持(505)'
                    break
                default:
                    errorMessage = `连接出错(${error.response.status})`
            }
        } else if (error.request) {
            errorMessage = '连接到服务器失败'
        } else {
            errorMessage = error.message
        }
        showToast(errorMessage)
        return Promise.reject(error)
    },
)

export default service
